/**
 * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
 */
package com.jeesite.modules.sys.service.support;

import com.jeesite.common.service.TreeService;
import com.jeesite.modules.file.utils.FileUploadUtils;
import com.jeesite.modules.sys.dao.CompanyOfficeDao;
import com.jeesite.modules.sys.dao.OfficeDao;
import com.jeesite.modules.sys.entity.CompanyOffice;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.service.DataScopeService;
import com.jeesite.modules.sys.service.OfficeService;
import com.jeesite.modules.sys.utils.EmpUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 部门Service
 *
 * @author ThinkGem
 * @version 2016-4-23
 */
@Transactional(readOnly = true)
public class OfficeServiceSupport extends TreeService < OfficeDao, Office >
        implements OfficeService {

    @Autowired
    private DataScopeService dataScopeService;
    @Autowired
    private CompanyOfficeDao companyOfficeDao;

    /**
     * 获取单条数据
     */
    @Override
    public Office get(Office office) {
        return super.get(office);
    }

    /**
     * 添加数据权限过滤条件
     */
    @Override
    public void addDataScopeFilter(Office office, String ctrlPermi) {
        office.getSqlMap().getDataScope().addFilter("dsf", "Office", "a.office_code",
                null, ctrlPermi, "office_user");
    }

    /**
     * 查询组织部门列表
     */
    @Override
    public List < Office > findList(Office office) {
        return super.findList(office);
    }

    /**
     * 保存数据（插入或更新）
     */
    @Override
    @Transactional(readOnly = false)
    public void save(Office office) {
        if (office.getIsNewRecord()) {
            genIdAndValid(office, office.getViewCode());
            // 当前新数据授权，如果用户有上级数据权限，则当前数据也有相应的数据权限
            dataScopeService.insertIfParentExists(office, "Office");
        }
        super.save(office);
        if (office.getCompany() != null && StringUtils.isBlank(office.getCompany().getCompanyCode())) {
            return;
        }
        // 取公司部门关联表
        List < CompanyOffice > list = companyOfficeDao.findList(new CompanyOffice());
        for (CompanyOffice companyOffice : list) {
            // 公司不变，删除  公司+old部门相同的
            if (office.getCompany().getCompanyCode().equals(office.getOldCompany())){
                if (office.getCompany().getCompanyCode().equals(companyOffice.getCompanyCode())
                        && office.getOfficeCode().equals(companyOffice.getOfficeCode())){
                    companyOfficeDao.delete(companyOffice);
                }
            }
            // 公司改变，删除  old公司+old部门相同的
            else{
                if (office.getOldCompany().equals(companyOffice.getCompanyCode())
                        && office.getOfficeCode().equals(companyOffice.getOfficeCode())){
                    companyOfficeDao.delete(companyOffice);
                }
            }
        }
        // 存关联表   公司+部门
        if (office.getCompany()!=null && StringUtils.isNotEmpty(office.getCompany().getCompanyCode())){
            CompanyOffice companyOffice = new CompanyOffice();
            companyOffice.setCompanyCode(office.getCompany().getCompanyCode());
            companyOffice.setOfficeCode(office.getOfficeCode());
            companyOfficeDao.insert(companyOffice);
        }

        // 保存上传附件
        FileUploadUtils.saveFileUpload(office.getId(), "office_file");
        // 清理部门相关缓存
        clearOfficeCache();
    }

    /**
     * 更新部门状态
     */
    @Override
    @Transactional(readOnly = false)
    public void updateStatus(Office office) {
        super.updateStatus(office);
        // 清理部门相关缓存
        clearOfficeCache();
    }

    /**
     * 删除数据
     */
    @Override
    @Transactional(readOnly = false)
    public void delete(Office office) {
        super.delete(office);
        // 清理部门相关缓存
        clearOfficeCache();
    }

    /**
     * 清理部门相关缓存
     */
    private void clearOfficeCache() {
//		EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_LIST);
        EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_ALL_LIST);
    }

}
